
%%

%class analex
%standalone

/* Posibilitar acceso a la columna y fila actual de analisis*/ 
%line
%column

%unicode
/* Habilitar la compatibilidad con el interfaz CUP para el generador sintactico  
%cup */

/* Tipo de implentacion del analizador lexico Tabla o Switch */ 
%table
/* %switch */


%state STRINGSIMPLE, STRINGDOBLE, COMMENT

macronotexto=" "|\n|\t|\r\n|\r|\f


%{
	String st;
	String [] rw = {"ebnf", "global", "terminal", "nonterminal", "operations", "ebnf2conway", "ebnf2glc", "glc2ebnf", "glc2conway", "all"};
	int line,column;
	Utility utility;
%}

%init{
	st="";
	utility=new Utility(rw);
%init}

%eof{

%eof}

%%

/* ------------------------Seccion de reglas y acciones ----------------------*/
<YYINITIAL> {
/*ebnf				{System.out.println("Token ebnf <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
*/
\{				{System.out.println("Token brace_o <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
\}				{System.out.println("Token brace_c <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
\=				{System.out.println("Token eq <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
\|						{System.out.println("Token pipe <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
\[						{System.out.println("Token bracket_o <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
\]						{System.out.println("Token bracket_c <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
\(						{System.out.println("Token paren_o <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
\)						{System.out.println("Token paren_c <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
/*
global				{System.out.println("Token global <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
terminal|nonterminal		{System.out.println("Token type <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
*/
,						{System.out.println("Token comma <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
;						{System.out.println("Token statement_end <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " +
							 (yycolumn+1));}
:=						{System.out.println("Token assignment <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
/*
operations			{System.out.println("Token operations <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
ebnf2conway			{System.out.println("Token ebnf2conway <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
glc2conway			{System.out.println("Token glc2conway <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
ebnf2glc				{System.out.println("Token ebnf2glc <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
glc2ebnf				{System.out.println("Token glc2ebnf <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
all					{System.out.println("Token all <" +yytext() + "> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));}
*/


[:jletter:][:jletterdigit:]* 	{
											if(utility.isReservedWord(yytext())){
												st=utility.getReservedWord(yytext());
												System.out.println("Token " + st + " <" +yytext()+ "> encontrado en linea: " + (yyline+1) + 
												" columna: " + (yycolumn+1));
											}else{
												System.out.println("Token id <" +yytext()+ "> encontrado en linea: " + (yyline+1) + 
												" columna: " + (yycolumn+1));
											}
										}
'					{st=""; yybegin(STRINGSIMPLE);}
\"					{st=""; yybegin(STRINGDOBLE);}
\/\*				{yybegin(COMMENT);}

::=				{System.out.println("-----> WARNING: < " +yytext()+ " >. linea: " + (yyline+1) + " columna: " + (yycolumn+1));
					 System.out.println("-----> Intenta escribir una asignacion en GLC? Escriba :=");
					 System.out.println("-----> Intenta escribir una asignacion en EBNF? Escriba =");
					 System.out.println("-----> Intenta escribir una cadena de texto? Escriba entre comillas");}

("_"|[:jletterdigit:])+		{System.out.println("-----> WARNING: < " +yytext()+ " >. linea: " + (yyline+1) + " columna: " + (yycolumn+1));
									 System.out.println("-----> Intenta escribir un ID?\n-----> Formato ID: letra(letra|digito)*");
									 System.out.println("-----> Intenta escribir una cadena de texto? Escriba entre comillas");}

{macronotexto}				{ /* ignoramos los saltos de linea y retornos de carro, los tabuladores, ignora los espacios en blanco */ }

<<EOF>>					{return YYEOF;}

. 			{System.out.println("-----> WARNING: < " +yytext()+ " >. linea: " + (yyline+1) + " columna: " + (yycolumn+1));
			 System.out.println("-----> Intenta escribir una cadena de texto? Escriba entre comillas");}


}/* fin YYinitial */

<STRINGSIMPLE>{
'						{System.out.println("Token string <\'" + st + "\'> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));
							yybegin(YYINITIAL);}
\"						{System.out.println("-----> WARNING < " + yytext() + " > encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));
						 System.out.println("-----> Intento de cerrar con \"?");
							st+=yytext();}
<<EOF>>					{System.out.println("Error. Cadena no cerrada correctamente. Debe cerrar con \'"); return YYEOF;}

{macronotexto}				{ /* ignoramos los saltos de linea y retornos de carro, los tabuladores, ignora los espacios en blanco */ }

.						{st+=yytext();}

}/* fin STRINGSIMPLE */

<STRINGDOBLE>{
\"					{System.out.println("Token string <\"" + st + "\"> encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));
							yybegin(YYINITIAL);}

'						{System.out.println("-----> WARNING < " + yytext() + " > encontrado en linea: " + (yyline+1) + " columna: " + (yycolumn+1));
						 System.out.println("-----> Intento de cerrar con \'?");
							st+=yytext();}
<<EOF>>					{System.out.println("Error. Cadena no cerrada correctamente. Debe cerrar con \"");return YYEOF;}

{macronotexto}				{ /* ignoramos los saltos de linea y retornos de carro, los tabuladores, ignora los espacios en blanco */ }

.						{st+=yytext();}

}/* fin STRINGDOBLE */



<COMMENT>{
\*\/					{yybegin(YYINITIAL);}

<<EOF>>					{System.out.println("Error. Comentario no cerrado correctamente. Debe cerrar con */"); return YYEOF;}

{macronotexto}				{ /* ignoramos los saltos de linea y retornos de carro, los tabuladores, ignora los espacios en blanco */ }

.						{}

}/* fin COMMENT */


